#include "stm32f10x.h"                  // Device header
#include "Delay.h"

#include "LED.h"
#include "Key.h"
#include "OLED.h"
#include "MyRTC.h"

int main(void)
{
	// 初始化
	OLED_Init();
	MyRTC_Init();
	
	// 开启 PWR 时钟: 待机模式的开启需要 PWR 外设的参与
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
	
	// WEAKUP 引脚使能, 允许 PA0 唤醒待机模式
	// 使能完毕后会被设置为强制下拉的配置, 所以不用在 GPIO 初始化了.
	// 插入高电平, 待机模式会被唤醒
	PWR_WakeUpPinCmd(ENABLE);
	
	OLED_ShowString(1, 1, "CNT:");    // 时间戳
	OLED_ShowString(2, 1, "ALR:");    // 闹钟值
	OLED_ShowString(3, 1, "ALRF:");   // 闹钟标志位 
	
	// 设置闹钟值为当前秒数 + 10
	uint32_t Alarm = RTC_GetCounter() + 10;
	RTC_SetAlarm(Alarm);
	
	// 显示闹钟值
	OLED_ShowNum(2, 6, Alarm, 10);
	
	while(1)
	{
		// OLED 显示 CNT
		OLED_ShowNum(1, 6, RTC_GetCounter() + 28800, 10);
		
		// OLED 显示闹钟标志位: 当闹钟触发的时候此标志位会被置为1
		OLED_ShowNum(3, 6, RTC_GetFlagStatus(RTC_FLAG_ALR), 1);
		
		// 闪烁显示 Running
		OLED_ShowString(4, 1, "Running");
		Delay_ms(1000);
		OLED_ShowString(4, 1, "       ");
		Delay_ms(1000);
		
		// 进入待机模式之前, 尽可能的把外挂的模块全部关闭掉, 极度省电. 
		// 如下使用 OLED_Clear 表示关闭外挂模块的电
		OLED_ShowString(4, 9, "StandBy");
		Delay_ms(1000);
		OLED_ShowString(4, 9, "       ");
		Delay_ms(1000);
		
		OLED_Clear();
		
		// 开启待机模式: 注意先要开启 PWR 的时钟
		// 注意: 待机模式唤醒后是从 SystemInit -> main 开始开始执行的。
		PWR_EnterSTANDBYMode();
	}
}